www.gusucode.com > VC编写的串口调试软件 > VC编写的串口调试软件,内含Modbus协议类 支持对Modbus通讯调试/Modbus串口调试软件1.0/com/ComData.cpp

    // ComData.cpp: implementation of the CComData class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "ComData.h"
#include <math.h>

#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
CComData::CComData()
{
//	m_strRegType="0" ;	//寄存器类型
//	m_strRegAddr="0" ;	//寄存器地址
//	m_strRegCount="1";	//寄存器数量
	m_strRegValue="00" ;	//值
	m_strOldRegValue="00";
	m_unRegType=0;		//寄存器类型
	m_unRegAddr=0;		//寄存器地址
	m_unRegCount=1;		//寄存器数量
	m_unPriority=0 ;			//标记
	
	m_strNote="*";

	m_unDataType=CComData::V_SN16;

	m_bReadWrite=true;	//读写操作
	m_nDecimal=0; 		//小数点位:0----整型操作

	m_unStationNum=-1;	//站号---控制器站号

	m_ucProtocalTxt[500]='\0';	//用于存放译码结果,如果是位读写,可能出现译码更新
	m_unDataLen=0;				//译码缓冲区有效长度
	m_ucRcvTxt[500]='\0';		//用于存放接收信息
	m_unRcvLen=0;				//接收字符长度
	m_unRcvBegin=0;				//接收字符有效数值位置
	m_unRcvCount=0;				//接收字符有效数值长度
	m_bTranstation=false;		//true----已经译码
	m_unReSend=0;	//>0----要求再发送次数
	m_unPriority=1;		//标记:读数据

	m_hClientWnd=NULL;			//宿主窗口句柄
	m_pReData=NULL;
}

CComData::CComData(CComData& Data)
{
//	m_strRegType=Data.m_strRegType ;	//寄存器类型
//	m_strRegAddr=Data.m_strRegAddr ;	//寄存器地址
//	m_strRegCount=Data.m_strRegCount;	//寄存器数量

	m_unRegType=Data.m_unRegType;		//寄存器类型
	m_unRegAddr=Data.m_unRegAddr;		//寄存器地址
	m_unRegCount=Data.m_unRegCount;		//寄存器数量

	m_strRegValue=Data.m_strRegValue ;	//值
	m_strOldRegValue=Data.m_strOldRegValue ;	//值
	m_unDataType=Data.m_unDataType;		//值---类型
	m_unPriority=Data.m_unPriority ;				//标记
	m_strNote=Data.m_strNote ;			//注释

	m_bReadWrite=Data.m_bReadWrite;		//读写操作
	m_nDecimal=Data.m_nDecimal; 		//小数点位:0----整型操作

	m_unStationNum=Data.m_unStationNum ;	//站号---控制器站号

	m_unDataLen=Data.m_unDataLen ;						//译码缓冲区有效长度
	m_unRcvLen=Data.m_unRcvLen;							//接收字符长度
	unsigned int n;
	for(n=0;n<m_unDataLen;n++)
	{
		m_ucProtocalTxt[n]=Data.m_ucProtocalTxt[n];
	}
	for(n=0;n<m_unRcvLen;n++)
	{
		m_ucRcvTxt[n]=Data.m_ucRcvTxt[n];
	}
//	strcpy((char*)m_ucProtocalTxt,(char*)Data.m_ucProtocalTxt);	//用于存放译码结果,如果是位读写,可能出现译码更新
//	strcpy((char*)m_ucRcvTxt,(char*)Data.m_ucRcvTxt);	//用于存放接收
	m_unRcvBegin=Data.m_unRcvBegin;				//接收字符有效数值位置
	m_unRcvCount=Data.m_unRcvCount;			//接收字符有效数值长度
	m_bTranstation=Data.m_bTranstation;	//true----已经译码
	m_unReSend=Data.m_unReSend ;			//>0----要求再发送次数

	m_strAlias=Data.m_strAlias ;		//别名

	m_hClientWnd=Data.m_hClientWnd;
	m_pReData=Data.m_pReData ;

}

CComData::~CComData()
{
}

CComData& CComData::operator=(CComData& Data)
{
//	m_strRegType=Data.m_strRegType;		//寄存器类型
//	m_strRegAddr=Data.m_strRegAddr;		//寄存器地址
//	m_strRegCount=Data.m_strRegCount;	//寄存器数量

	m_unRegType=Data.m_unRegType;		//寄存器类型
	m_unRegAddr=Data.m_unRegAddr;		//寄存器地址
	m_unRegCount=Data.m_unRegCount;		//寄存器数量

	m_strRegValue=Data.m_strRegValue;	//值
	m_strOldRegValue=Data.m_strOldRegValue ;	//值
	m_unDataType=Data.m_unDataType;		//值---类型
	m_unPriority=Data.m_unPriority ;				//标记
	m_strNote=Data.m_strNote ;			//注释


	m_bReadWrite=Data.m_bReadWrite;		//读写操作
	m_nDecimal=Data.m_nDecimal; 		//小数点位:0----整型操作

	m_unStationNum=Data.m_unStationNum ;	//站号---控制器站号

	m_unDataLen=Data.m_unDataLen ;		//译码缓冲区有效长度
	m_unRcvLen=Data.m_unRcvLen;			//接收字符长度
	unsigned int n;
	for(n=0;n<m_unDataLen;n++)
	{
		m_ucProtocalTxt[n]=Data.m_ucProtocalTxt[n];
	}
	for(n=0;n<m_unRcvLen;n++)
	{
		m_ucRcvTxt[n]=Data.m_ucRcvTxt[n];
	}
//	strcpy((char*)m_ucProtocalTxt,(char*)Data.m_ucProtocalTxt);	//用于存放译码结果,如果是位读写,可能出现译码更新
//	strcpy((char*)m_ucRcvTxt,(char*)Data.m_ucRcvTxt);			//用于存放接收
	m_unRcvBegin=Data.m_unRcvBegin;		//接收字符有效数值位置
	m_unRcvCount=Data.m_unRcvCount;		//接收字符有效数值长度
	m_bTranstation=Data.m_bTranstation;	//true----已经译码
	m_unReSend=Data.m_unReSend ;			//>0----要求再发送次数

	m_strAlias=Data.m_strAlias ;		//别名

	m_hClientWnd=Data.m_hClientWnd;
	m_pReData=Data.m_pReData ;
	return *this;
}
	
BOOL CComData::IsBit()
{
	if(V_BBIT==m_unDataType)
		return TRUE;
	return FALSE;
}

BOOL CComData::IsFloat ()
{
	return m_nDecimal;
}

bool CComData::IsReadWrite ()
{
	return m_bReadWrite;
}

bool CComData::SetReadWrite(bool bRW)
{
	bool bOldReadWrite=m_bReadWrite;
	m_bReadWrite=bRW;
	return bOldReadWrite;
}

void CComData::SetRegister( unsigned int unRegAddr,int nStationNum/*=0*/)
{
	m_unRegAddr=unRegAddr;
	
	m_unStationNum=nStationNum;
}

CString CComData::GetBit_Byte(CString strValue)	//用于位写操作
{

	CString strNewValue;
	/*	
	unsigned char cByte;
	cByte=unsigned char(atoi(strValue));

	unsigned char cBit[8];
//	m_strRegValue="1";
	if(m_strRegValue=="1")
	{
		cBit[0]=0x01;
		cBit[1]=0x02;
		cBit[2]=0x04;
		cBit[3]=0x08;
		cBit[4]=0x10;
		cBit[5]=0x20;
		cBit[6]=0x40;
		cBit[7]=0x80;

		strNewValue.Format("%d",cByte | cBit[m_bBit]);

	}
	else	//"0"
	{
		cBit[0]=0xFE;
		cBit[1]=0xFD;
		cBit[2]=0xFB;
		cBit[3]=0xF7;
		cBit[4]=0xEF;
		cBit[5]=0xDF;
		cBit[6]=0xBF;
		cBit[7]=0x7F;

		strNewValue.Format("%d",cByte & cBit[m_bBit]);
	}
//*/
	return strNewValue;	
}

unsigned int CComData::GetRegister ()
{
	return m_unRegAddr;
}

CString CComData::GetValue(bool bFlash)
{
	if(bFlash)
	{
		Transform(&m_ucRcvTxt[m_unRcvBegin],m_unRcvCount);
	}
	return m_strRegValue;
}

int  CComData::GetValue()
{
	/*
		 V_B0,V_B1,V_B2,V_B3,V_B4,V_B5,V_B6,V_B7,
		 V_SN8,V_SN16,V_SN32,	//符号 
		 V_UN8,V_UN16,V_UN32,	//无符号
		 V_FV32,				//浮点
		 V_SNF16,V_SNF32,		//用整形数表示浮点(小数位由m_nDecimal确定)
		 V_UNF16,V_UNF32,		//用整形数表示浮点(小数位由m_nDecimal确定)
		 V_CV					//字符
	if(m_bBit>=0)
	{
		unsigned char cByte;
		cByte=unsigned char(atoi(m_strRegValue));
		cByte=cByte>>m_bBit;
		cByte=cByte&0x01;
		return cByte;
	}
	return atoi(m_strRegValue);
	//*/
	return atoi(m_strRegValue);
}

void CComData::SetValue (CString strValue,bool bRW/*=true*/)
{
	m_strRegValue=strValue;
	m_bReadWrite=bRW;		//读
//	TRACE("%s-----------%s\n",m_strRegister,m_strRegValue);
}

void CComData::Trace()
{
	TRACE("% 6d=%s,bReadWrite=%d\n",m_unRegAddr,m_strRegValue,m_bReadWrite);
}

//$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
//名称: Transform------转换成十进制、十六进制、二进制
//----------------------------------------------------
//参数: unsigned char &pChar-------------数据数组
//      unsigned int unLen---------------数据长度
//		bool bBinary---------------------true:二进制传输;false:ASC码传输
//				
//----------------------------------------------------
//功能: 对发送数据进行译码
//----------------------------------------------------
//返回值:
//	void	
//$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
void CComData::Transform(const unsigned char* pBuf, unsigned int unLen)
{
	switch(m_unDataType)
	{
	case V_HEX:
		{
			Transform_Hex(pBuf,unLen);
			break;
		}
	case V_HEXASC:
		{
			Transform_HexAsc(pBuf,unLen);
			break;
		}
	case V_CV:
		{
			m_strRegValue.Empty ();
			for(int n=unLen-1;n>=0;n--)
				m_strRegValue.Insert (0,*(pBuf+n));
			break;
		}
	default:
		{
			Transform_Binary(pBuf,unLen);
		}
	}
	m_strOldRegValue=m_strRegValue;
}

//$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
//名称: Transform------转换成十进制、十六进制、二进制
//----------------------------------------------------
//参数: unsigned char &pChar-------------数据数组
//      unsigned int unLen---------------数据长度
//				
//----------------------------------------------------
//功能: 对发送数据进行译码
//----------------------------------------------------
//返回值:
//	void	
//$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
void CComData::Transform_Hex(const unsigned char* pBuf, unsigned int unLen)
{//如果是位操作,则应返回的是无符号整形(0-256)

	int nN=0;
	int nValue=0;
	for(unsigned int n=0;n<unLen;n++)
	{
		float fX = 256.0f;
		int   nY = unLen-1-n;
		float fValue = pow( fX,nY);
		nValue+=pBuf[n]*int(fValue);
	}
	
	//判断正负数
	if(nN>127)
	{
		float fX = 16.0f;
		int   nY = unLen - 0;
		float fValue = pow( fX,nY);

		nValue-=int(fValue);
	}

	m_strRegValue.Format ("%d",nValue);
	int nLen=m_strRegValue.GetLength ();
	if(0<m_nDecimal)
	{//有小数点
		if(nLen>m_nDecimal)
			m_strRegValue.Insert (nLen-m_nDecimal,'.');
		else	//次数为<1.0的小数
		{
			for(int n=0;n<m_nDecimal-nLen;n++)
				m_strRegValue.Insert (n,'0');
			m_strRegValue.Insert (1,'.');

		}
	}

}



void CComData::Transform_HexAsc(const unsigned char *pBuf, unsigned int unLen)
{
	m_strRegValue.Empty ();

	CString strBHex;
	for(UINT nIndex=0;nIndex<unLen;nIndex++)
	{
		strBHex.Format ("%02x",pBuf[nIndex]);
		m_strRegValue+=strBHex;
	}

	return;
	for(unsigned int n=unLen-1;n>=0;n--)
	{

		unsigned char ucByte4H=(unsigned char)pBuf[n]>>4 & 0x0F;
		unsigned char ucByte4L=(unsigned char)pBuf[n] & 0x0F;

		if(ucByte4H>0x09)
			ucByte4H+='A'-0x0A;
		else
			ucByte4H+='0';

		if(ucByte4L>0x09)
			ucByte4L+='A'-0x0A;
		else
			ucByte4L+='0';

		m_strRegValue+=ucByte4H;
		m_strRegValue+=ucByte4L;
	}
	
}

//$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
//名称: Transform------转换成十进制、十六进制、二进制
//----------------------------------------------------
//参数: unsigned char &pChar-------------数据数组
//      unsigned int unLen---------------数据长度
//				
//----------------------------------------------------
//功能: 对发送数据进行译码
//----------------------------------------------------
//返回值:-------暂不支持浮点数据
//	void	
//$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
void CComData::Transform_Binary(const unsigned char* pBuf, unsigned int unLen)	//Binary
{
	switch(m_unDataType)
	{
	case CComData::V_BBIT:
		{
			int nMoveByte=unLen-1-m_nDecimal/8;
			int nMoveBit=m_nDecimal%8;
			int nBit=*(pBuf+nMoveByte)>>nMoveBit & 0x01;
			m_strRegValue.Format("%d",nBit);

			break;
		}
	case CComData::V_SN8:
		{
			if(1==unLen)
			{
				int nValue=*pBuf;
				if(0x01==pBuf[0]>>8)
				{
					nValue=0xFF-nValue+1;
				}
				m_strRegValue.Format("%d",nValue);
			}
			break;
		}
	case CComData::V_SN16:
		{
			if(2==unLen)
			{
				short nValue=pBuf[0]<<8|pBuf[1];
				m_strRegValue.Format("%d",nValue);
			}
			break;
		}
	case CComData::V_SN32:
		{
			if(4==unLen)
			{
				int nValue=pBuf[0]<<24|pBuf[1]<<16|pBuf[2]<<8|pBuf[3];
				m_strRegValue.Format("%d",nValue);
			}
			break;
		}
	case CComData::V_UN8:
		{
			if(1==unLen)
			{
				unsigned int nValue=*pBuf;
				m_strRegValue.Format("%u",nValue);
			}
			break;
		}
	case CComData::V_UN16:
		{	//[HighByte LowByte]
			if(2==unLen)
			{
				unsigned short nValue=pBuf[0]<<8|pBuf[1];
				m_strRegValue.Format("%u",nValue);
			}
			break;
		}
	case CComData::V_UN32:
		{	//[HighWord LowWord]
			if(4==unLen)
			{
				unsigned int  nValue=pBuf[0]<<24|pBuf[1]<<16|pBuf[2]<<8|pBuf[3];
				m_strRegValue.Format("%u",nValue);
			}
			break;
		}
	case CComData::V_FV32:
		{	//位数
			if(4==unLen)
			{
//				float fValue=(pBuf[0]<<24) | (pBuf[1]<<16) | (pBuf[2]<<8) | pBuf[3];
//				m_strRegValue.Format("%f",fValue);
			}
			break;
		}
	case CComData::V_SNF16:	//用整形数表示浮点(小数位由m_nDecimal确定)
		{
			if(2==unLen)
			{
				int nValue=pBuf[0]<<8|pBuf[1];
				if(0x01==pBuf[0]>>7)
				{
					nValue=-(0xFFFF-nValue+1);
				}
				double fValue=float(nValue/pow(10.f,m_nDecimal));
				ToStrFloat(fValue,m_nDecimal);
			}
			break;
		}
	case CComData::V_SNF32:	//用整形数表示浮点(小数位由m_nDecimal确定)
		{
			if(4==unLen)
			{
				int nValue=pBuf[0]<<24|pBuf[1]<<16|pBuf[2]<<8|pBuf[3];
				double fValue=float(nValue/pow(10.f,m_nDecimal));
				ToStrFloat(fValue,m_nDecimal);
			}
			break;
		}
	case CComData::V_UNF16:	//用整形数表示浮点(小数位由m_nDecimal确定)
		{
			if(2==unLen)
			{
				unsigned short nValue=pBuf[0]<<8|pBuf[1];
				double fValue=float(nValue/pow(10.f,m_nDecimal));
				ToStrFloat(fValue,m_nDecimal);
			}
		}
	case CComData::V_UNF32:	//用整形数表示浮点(小数位由m_nDecimal确定)
		{
			if(4==unLen)
			{
				unsigned int nValue=pBuf[0]<<24|pBuf[1]<<16|pBuf[2]<<8|pBuf[0];
				double fValue=float(nValue/pow(10.f,m_nDecimal));
				ToStrFloat(fValue,m_nDecimal);
			}
			break;
		}
	default:
		{
			TRACE("CComData::Transform_Binary()-------数据转换不正确");
			break;
		}
	}
}

/*
istream& operator>>(istream &stream,CComData& Data)
{
	char cAlias[100];
	char cNote[500];
	cAlias[0]='\0';
	cNote[0]='\0';
	
	if(CComData::m_unVersionNum<=VERSIONNUM0100)
	{
	stream>>cAlias					//01、别名
		  >>Data.m_unStationNum		//02、站号
		  >>Data.m_unRegType		//03、寄存器类型
		  >>Data.m_unRegAddr 		//04、寄存器地址
		  >>Data.m_unRegCount		//05、寄存器数量
		  >>Data.m_unDataType		//06、数值类型
		  >>Data.m_nDecimal			//07、小数点位
		  >>Data.m_unPriority 			//08、标记
		  >>cNote					//09、注释
		;
	Data.m_strAlias.Format ("%s",cAlias);
	Data.m_strNote.Format ("%s",cNote);
	}

	return stream;
}
//*/

/*
ostream& operator<<(ostream &stream,CComData& Data)
{
	char cEnter[2];
	cEnter[0]=10;
	cEnter[1]='\0';

	if(CComData::m_unVersionNum<=VERSIONNUM0100)
	{
	stream<<cEnter
		  <<Data.m_strAlias			//01、别名
		  <<"    "
		  <<Data.m_unStationNum		//02、站号
		  <<"    "
		  <<Data.m_unRegType		//03、寄存器类型
//		  <<Data.m_strRegType		//寄存器类型
		  <<"    "
		  <<Data.m_unRegAddr		//04、寄存器地址
		  <<"    "
		  <<Data.m_unRegCount		//05、寄存器数量
		  <<"    "
		  <<Data.m_unDataType		//06、数值类型
		  <<"    "
		  <<Data.m_nDecimal			//07、小数点位
		  <<"    "
		  <<Data.m_unPriority 		//08、访问优先级
		  <<"    "
		  <<Data.m_strNote			//09、注释
		;

	}
	return stream;
}
//*/

void CComData::ToStrFloat(double fValue, int nDecimal)
{

	switch(nDecimal)
	{
	case 0:
		m_strRegValue.Format("%.0f",fValue);
		break;
	case 1:
		m_strRegValue.Format("%.1f",fValue);
		break;
	case 2:
		m_strRegValue.Format("%.2f",fValue);
		break;
	case 3:
		m_strRegValue.Format("%.3f",fValue);
		break;
	default:
		m_strRegValue.Format("%.4f",fValue);
	}
}

void CComData::ReadMemData(CMemFile* pMemFile)
{
	if(NULL==pMemFile)
		return;
	m_unRcvBegin =0;
	pMemFile->Read( &m_unRcvCount,sizeof(int));
	pMemFile->Read((void*)&m_ucRcvTxt[0],m_unRcvCount);
	m_unRcvLen=m_unRcvCount;

#ifdef _DEBUG
	CString strDebug;
	CString strC;
	for(unsigned int n=0;n<m_unRcvCount;n++)
	{
		strC.Format ("%x",m_ucRcvTxt[n]);
		strDebug+=strC;
	}
//	TRACE("CComData::ReadMemData()--%s:%s\n",m_strAlias,strDebug);
#endif
}

void CComData::WriteMemData(CMemFile* pMemFile) const
{
	if(NULL==pMemFile)
		return;
					
	char cValue[1024];
	strcpy(cValue,m_strRegValue);
	int nLen=m_strRegValue.GetLength ();

//	char cLen[4];
//	itoa(nLen,cLen,10);
//	pMemFile->Write( cLen,4);
//	pMemFile->Write( &m_unPriority,sizeof(int));
	pMemFile->Write( &m_unRcvCount,sizeof(int));
//	pMemFile->Write( (void*)cValue,nLen);
	pMemFile->Write((void*)&m_ucRcvTxt[m_unRcvBegin],m_unRcvCount);
//	TRACE("CComData::WriteMemData()  %s--%d:%s\n",m_strAlias,nLen,cValue);
}

//版本号
UINT CComData::m_unVersionNum=VERSIONNUM0100;
UINT CComData::m_unNewVersionNum=VERSIONNUM0100;